本篇的主題是要介紹前面提到的驗證之schema(xsd是其副檔名)。
相較於 DTD,schema 是 XML 界近年來比較廣泛使用來驗證資料格式正確性的做法,基本的使用做法跟 DTD 類似,寫一套用來描述一份 XML 文件格式的語言,再一次,跟 XSL/DTD 一樣,一份 xsd 的型式,仍然是一份 XML ,大概長得如下圖。
這是用來描述下面這個 XML 的結構
接著大致說明schema的內容
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="ipo:purchaseOrder">
<xs:complexType>
<xs:sequence>
<xs:element name="shipTo" type="AddressType"/>
<xs:element name="billTo" type="AddressType"/>
<xs:element name="Items" type="ItemsType"/>
</xs:sequence>
<xs:attribute name="xmlns:ipo" type="xs:string" use="required"/>
<xs:attribute name="orderDate" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:complexType name="AddressType">
<xs:sequence>
<xs:element name="name" ref="name"/>
<xs:element name="street" ref="street"/>
<xs:element name="city" ref="city"/>
<xs:element name="state" ref="state"/>
<xs:element name="zip" ref="zip"/>
</xs:sequence>
<xs:attribute name="xsi:type" type="xs:string" use="required"/>
</xs:complexType>
<xs:complexType name="ItemsType"> <xs:sequence><xs:element name="item" type="itemType" minOccurs="1" maxOccurs="unbounded"/></xs:sequence></xs:complexType>
<xs:complexType name="itemType">
<xs:sequence>
<xs:element name="productName" ref="productName"/>
<xs:element name="quantity" ref="quantity"/>
<xs:element name="price" ref="price"/>
<xs:element name="ipo:comment" ref="ipo:comment" minOccurs="0" maxOccurs="1"/>
<xs:element name="shipDate" ref="shipDate"/>
</xs:sequence>
<xs:attribute name="partNum" type="xs:string" use="required"/>
</xs:complexType>
<xs:element name="productName" type="xs:string"/>
<xs:element name="quantity" type="xs:string"/>
<xs:element name="price" type="xs:string"/>
<xs:element name="ipo:comment" type="xs:string"/>
<xs:element name="shipDate" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="state" type="xs:string"/>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="zip" type="xs:string"/>
</xs:schema>
在 W3C 的規格中,針對 schema 有很詳盡的規範,在這裡我就只針對範例資料做說明,主要目的是可以讓你對 schema 進行一個大概的了解,等到有一天真的派上用場了,再去詳細研究細節。
Line 3-13:最外層的ipo:purchaseOrder,你可以把這種寫法想像成是一隻程式裡的 main(),與 DTD 的差別之一是,DTD 針對欄位結構和屬性是分開描述,而在schema 裡是包在一起,這樣看起來比較一目了然。
Line 14-23:描述名為 AddressType 的 ComplexType,schema 提供了 DTD 沒有的ComplexType 的做法,觀念有點像寫程式裡的可重覆使用模組,以這個例子而言,shipTo 和 billTo,一個是送貨地址,一個是帳單地址,兩者都是相同格式的「地址」,所以沒有重覆描述的必要。做法如上所示,在列14-23宣告一個「AddressType」,然後在列6,列7參照引用
Line 24:描述 Items 和 item 的從屬關係,可以發現到這裡描述 item,是以「minOccurs="1" maxOccurs="unbounded"」的方式表達,語意上更為清楚易懂。
Line 25-34:描述 item 的 ComplexType
Line 35-44:描述最細部的各欄位,這部份 schema 提供了所謂的 Simple Type,用來描述欄位的資料型態,林林總總有三四十種,最常用的就是 string 了
我寫了這麼幾篇你還看不懂
證明我寫的真的是「技術」的文章
回到最基本的觀念,只有這三點
1.XML是結構化的資料格式
2.schema是描述那個結構的語言,你可以看成是「寫程式的規格文件」
3.schema不是給人看的文件,schema是給「程式」看的規格
要描述一份XML的結構
可以用口語,也可以用Word檔描述(現在大多數都是如此)
但是以上兩者都要經過程式設計人員的「轉換」成程式語言
才可以用程式去檢驗XML格式的正確性
而萬一資料格式有改變(加減欄位...等等)
就得修改程式來配合
如果使用schema的話
就可以不用一直改程式
只要改那份schema就好了
舉例來說
如果你要寫出像http://ithelp.ithome.com.tw/rss/question的XML(註)
就得去讀rss的規格文件然後用程式去產生
產生之後呢?格式對或錯呢?
此時就可以用schema來驗證
而w3c也用rss的schema寫了個線上驗證的服務
只要填入rss的url、按個鍵
立刻就像被X光掃過一樣
你可以拿iT邦幫忙的http://ithelp.ithome.com.tw/rss/question去給他驗證看看
就可以發現有一堆不合法的格式及資料
註:您或許已知道,有許多的套件可以自動生成RSS的資料,千萬不要自己寫,浪費生命
原來如此,我懂了。
我有另一個問題...xml是自訂標簽,那我去開網頁時,我的瀏覽器怎麼會知道,這個標簽是什麼意思?這問題可能很笨...
瀏覽器只認得HTML那些標簽,不認得其他XML的標簽
對瀏覽器而言
<USA></USA><美國></美國><美濃></美濃>
都只是一個XML的標簽
沒什麼特殊差別
iT邦幫忙MVPantijava提到:
千萬不要自己寫,浪費生命
原來我的生命就這樣浪費掉了→不會xml會短命 (筆記)